#coding:utf-8

#ultima versão funcional sem condicao de armijo

from math import e

class PointFunctions():
	
	@staticmethod
	def calcular_sobre_contorno(pt,fn_cor,tolerancia):
		xi = pt.x
		yi = pt.y
		
		var_x = fn_cor(xi,yi) - fn_cor(xi-1,yi)
		var_y = fn_cor(xi,yi) - fn_cor(xi,yi-1)
		
		return ( abs(var_x) + abs(var_y) ) > tolerancia

	@staticmethod
	def calcular_nao_se_mexe(pt,historico):
		maior = 0		
		
		if pt.contador_pesca == -2:
			return False
		
		if pt.contador_pesca > 0:
			pt.contador_pesca -=1
			return True
			
		for i in range(0,4):
			xk = historico.get_historico(-i)
			
			if xk == 0:
				return False
			
			temp = pt.distancia( xk.pontos[pt.indice] )
			
			if temp>maior:
				maior = temp
							
		if maior < 1:			
			pt.contador_pesca = 5		
			return True
			
	@staticmethod
	def calcular_variacao_cor_normalizada(pt,fn_cor,tolerancia):
		'''
				max_var      
		   ------------------  = novo_mult
				  var        
				  
				  
			Quanto maior a varia��o, mais pr�ximo do contorno estou, dessa forma eu devo dar menos import�ncia a componente de cor, caso contr�rio haver� um grande
			deslocamento.
			
			Fun��o cor retorna inteiro no intervalo 0-255. Normalizar para um intervalo de 0 a 20
		'''
		normalizador = 0.0138408304 # ( 30/255.0 )^2
		
		max_var = normalizador
		
		var_x = -2*( fn_cor(pt.x,pt.y) - fn_cor(pt.x-1,pt.y) ) * ( ( fn_cor(pt.x,pt.y) - fn_cor(pt.x-1,pt.y) ) - ( fn_cor(pt.x-1,pt.y) - fn_cor(pt.x-2,pt.y) ) )
		var_y = -2*( fn_cor(pt.x,pt.y) - fn_cor(pt.x,pt.y-1) ) * ( ( fn_cor(pt.x,pt.y) - fn_cor(pt.x,pt.y-1) ) - ( fn_cor(pt.x,pt.y-1) - fn_cor(pt.x,pt.y-2) ) )
		
		var_x = abs(var_x)
		var_y = abs(var_y)
		
		
		if var_x >= 900:
			indice_x = 1/1000.0
		elif var_x >= 450:
			indice_x = 1/400.0
		elif var_x >= 225:
			indice_x = 1/150.0
		elif var_x>=100:
			indice_x = 1/80.0
		elif var_x>=50:
			indice_x = 1/35.0
		else:
			indice_x = 1/25.0
		
		if var_y >= 900:
			indice_y = 1/1000.0
		elif var_y >= 450:
			indice_y = 1/400.0
		elif var_y >= 225:
			indice_y = 1/150.0
		elif var_y>=100:
			indice_y = 1/80.0
		elif var_y>=50:
			indice_y = 1/35.0
		else:
			indice_y = 1/25.0
	
		'''
		if abs(var_x) < 1:
			indice_x = max_var
		else:		
			indice_x = ( max_var ) / pow(1.004,var_x)
			
		if abs(var_y) < 1:
			indice_y = max_var
		else:
			indice_y = ( max_var ) / pow(1.004,var_y)
			
		var_atual = ( var_x, var_y )
		'''
		
		return ( indice_x,indice_y )	

	@staticmethod
	def calcular_quina(pt,fn_cor):
		viz = []
		
		cor_pt = fn_cor(pt.x,pt.y)
		total_qd = 0
		max_total_consec = 0
		lim = 16.87059
				
		viz.append( (pt.x,pt.y-1) )
		viz.append( (pt.x+1,pt.y-1) )
		
		viz.append( (pt.x+1,pt.y) )
		viz.append( (pt.x+1,pt.y+1) )
		
		viz.append( (pt.x,pt.y+1) )
		viz.append( (pt.x-1,pt.y+1) )
		
		viz.append( (pt.x-1,pt.y) )
		viz.append( (pt.x-1,pt.y-1) )
		
		total_consec = 0
		for i in range(0,8):
	
			delta = abs( fn_cor( viz[i][0],viz[i][1] ) - cor_pt )
		
			if delta>lim:
				total_qd+=1
				total_consec+=1
			else:
				if total_consec > max_total_consec:
					max_total_consec = total_consec
					
				total_consec = 0
				
		
		if total_qd>=2 and (max_total_consec==2 or max_total_consec==3):
			return True
		else:
			return False
